home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / MosaicSRC / libwww2 / HTWriter.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-13  |  3.5 KB  |  179 lines

  1. /*        FILE WRITER            HTWrite.c
  2. **        ===========
  3. **
  4. */
  5. #include "HTWriter.h"
  6.  
  7. #define BUFFER_SIZE 4096    /* Tradeoff */
  8.  
  9. #include "HTUtils.h"
  10. #include "tcp.h"
  11. #include <stdio.h>
  12.  
  13.  
  14. /*        HTML Object
  15. **        -----------
  16. */
  17.  
  18. struct _HTStream {
  19.     CONST HTStreamClass *    isa;
  20.  
  21.     int    soc;
  22.     char    *write_pointer;
  23.     char     buffer[BUFFER_SIZE];
  24. };
  25.  
  26.  
  27. /*    Write the buffer out to the socket
  28. **    ----------------------------------
  29. */
  30.  
  31. PRIVATE void flush ARGS1(HTStream *, me)
  32. {
  33.     char *read_pointer     = me->buffer;
  34.     char *write_pointer = me->write_pointer;
  35.  
  36.     while (read_pointer < write_pointer) {
  37.         int status;
  38.     status = NETWRITE(me->soc, me->buffer,
  39.             write_pointer - read_pointer);
  40.     if (status<0) {
  41.         if(TRACE) fprintf(stderr,
  42.         "HTWrite: Error on socket output stream!!!\n");
  43.         return;
  44.     }
  45.     read_pointer = read_pointer + status;
  46.     }
  47.     me->write_pointer = me->buffer;
  48. }
  49.  
  50.  
  51. /*_________________________________________________________________________
  52. **
  53. **            A C T I O N     R O U T I N E S
  54. */
  55.  
  56. /*    Character handling
  57. **    ------------------
  58. */
  59.  
  60. PRIVATE void HTWriter_put_character ARGS2(HTStream *, me, char, c)
  61. {
  62.     if (me->write_pointer == &me->buffer[BUFFER_SIZE]) flush(me);
  63.     *me->write_pointer++ = c;
  64. }
  65.  
  66.  
  67.  
  68. /*    String handling
  69. **    ---------------
  70. **
  71. **    Strings must be smaller than this buffer size.
  72. */
  73. PRIVATE void HTWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
  74. {
  75.     int l = strlen(s);
  76.     if (me->write_pointer + l > &me->buffer[BUFFER_SIZE]) flush(me);
  77.     strcpy(me->write_pointer, s);
  78.     me->write_pointer = me->write_pointer + l;
  79. }
  80.  
  81.  
  82. /*    Buffer write.  Buffers can (and should!) be big.
  83. **    ------------
  84. */
  85. PRIVATE void HTWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
  86. {
  87.  
  88.     CONST char *read_pointer     = s;
  89.     CONST char *write_pointer = s+l;
  90.  
  91.     flush(me);        /* First get rid of our buffer */
  92.  
  93.     while (read_pointer < write_pointer) {
  94.         int status = NETWRITE(me->soc, read_pointer,
  95.             write_pointer - read_pointer);
  96.     if (status<0) {
  97.         if(TRACE) fprintf(stderr,
  98.         "HTWriter_write: Error on socket output stream!!!\n");
  99.         return;
  100.     }
  101.     read_pointer = read_pointer + status;
  102.     }
  103. }
  104.  
  105.  
  106.  
  107.  
  108. /*    Free an HTML object
  109. **    -------------------
  110. **
  111. **    Note that the SGML parsing context is freed, but the created object is not,
  112. **    as it takes on an existence of its own unless explicitly freed.
  113. */
  114. PRIVATE void HTWriter_free ARGS1(HTStream *, me)
  115. {
  116.     NETCLOSE(me->soc);
  117.     flush(me);
  118.     free(me);
  119. }
  120.  
  121. /*    End writing
  122. */
  123.  
  124. PRIVATE void HTWriter_end_document ARGS1(HTStream *, me)
  125. {
  126.     flush(me);
  127. }
  128.  
  129. PRIVATE void HTWriter_handle_interrupt ARGS1(HTStream *, me)
  130. {
  131. }
  132.  
  133.  
  134.  
  135. /*    Structured Object Class
  136. **    -----------------------
  137. */
  138. PRIVATE CONST HTStreamClass HTWriter = /* As opposed to print etc */
  139. {        
  140.     "SocketWriter",
  141.     HTWriter_free,
  142.     HTWriter_end_document,
  143.     HTWriter_put_character,     HTWriter_put_string,
  144.     HTWriter_write,
  145.         HTWriter_handle_interrupt
  146. }; 
  147.  
  148.  
  149. /*    Subclass-specific Methods
  150. **    -------------------------
  151. */
  152.  
  153. PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
  154. {
  155.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  156.     if (me == NULL) outofmem(__FILE__, "HTWriter_new");
  157.     me->isa = &HTWriter;       
  158.     
  159.     me->soc = soc;
  160.     me->write_pointer = me->buffer;
  161.     return me;
  162. }
  163.  
  164. /*    Subclass-specific Methods
  165. **    -------------------------
  166. */
  167.  
  168. PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
  169. {
  170.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  171.     if (me == NULL) outofmem(__FILE__, "HTASCIIWriter");
  172.     me->isa = &HTWriter;       
  173.  
  174.     me->soc = soc;
  175.     me->write_pointer = me->buffer;
  176.     return me;
  177. }
  178.  
  179.